BOOL / bool / Boolean / NSCFBoolean

原文

Objective-C用BOOL来编码真值。它是signed char的typedef,并且用宏YES和NO来相应的表示真和假。

布尔值用于条件判断,比如if和while语句,来进行有条件的逻辑或者重复运行。当判断一个条件语句,数值0为“假”,而其他任何数值为“真”。因为NULL和nil被定义为0,所以对于这些不存在的数值的条件语句也被判定为“假”。

在Objective-C中,当遇到处理真值的参数,属性和实例变量时,使用类型BOOL。当分配字面值时,使用宏YES和NO。

延伸:signed char整数范围为-128到127,unsigned char整数范围为0到255。

新手程序员在判断条件句是总是使用一个等式运算符

if ([a isEqual:b] == YES) {
      ...
}

这是没必要的。就像下面:

static BOOL different (int a, int b) {
    return a - b;
}

if (different(11, 10) == YES) {
      printf ("11 != 10\n");
} else {
      printf ("11 == 10\n");
}
print: 11 != 10

从算数运算中提取真值并不是一个好主意,它可能符合语法(毕竟,BOOL是一个signed char,因此它可以被视为数字),但是它在语意上完全说不通。所以,取而代之的方法是,使用==输出的结果,或者将数值通过!(或者!!)转换成布尔值。

## [](#NSNumber-and-BOOL "NSNumber and BOOL")NSNumber and BOOL
<pre>`NSLog(@"%@", [@(YES) class]);
输出的结果是:__NSCFBoolean

一直以来,我们都以为NSNumber将原始数封装为对象表示。其它任何由integer-和float-衍生出来的NSNumber对象都显示它的类为__NSCFNumber。这是为什么?

NSCFBoolean是NSNumber类簇中的一个私有的类。它是通往CFBooleanRef类型的桥梁,它被用来给Core Foundation的属性列表和集合封装布尔数值。CFBoolean定义了常量kCFBooleanTrue和kCFBooleanFalse。因为CFNumberRef和CFBooleanRef在Core Foundation中属于不同种类,这样是有道理的,它们在NSNumber被以不同的衔接类呈现。

表格是Objective-C中的所有真值类型和数值: